#include "matriz.h"

/* Probar las funciones de matriz.cpp */
/* que son:
	void traspuesta(Matriz& A, Matriz& res, int n);
	void swap(Matriz& A, int i, int j, int k, int n); 
	void mul(Matriz& A, Matriz& B, Matriz& res, int n);
	void mostrarMatriz(const Matriz& M, int n);
*/

int main()
{
	cout.precision(4);
	int n = 5;
	
	Matriz A (n, Vector(n, 0));
	Matriz B (n, Vector(n, 0));
	
	forn(i, n)
	{
		forn(j, n)
		{
			A[i][j] = i + j;
			B[i][j] = i*i + j;
		}
	}
	
	cout << "A" << endl;
	mostrarMatriz(A, n);
	cout << "B" << endl;
	mostrarMatriz(B, n);
	Matriz trasp (n, Vector(n));
	cout << "Traspuesta" << endl;
	traspuesta(A, trasp, n);	
	mostrarMatriz(trasp, n);
	Matriz res (n, Vector(n));
	mul(A, B, res, n);
	cout << "A*B" << endl;
	mostrarMatriz(res, n);
	
	Matriz C (3, Vector(3, 0));	
	C[0][0] = 0;
	C[0][1] = 1;
	C[0][2] = 2;
	C[1][0] = 3;
	C[1][1] = 15;
	C[1][2] = 15;
	C[2][0] = 8;
	C[2][1] = 10;
	C[2][2] = 24;
	
	cout << "C" << endl;
	mostrarMatriz(C, 3);
	Matriz traspC (3, Vector(3));
	cout << "Traspuesta de C" << endl;
	traspuesta(C, traspC, 3);	
	mostrarMatriz(traspC, 3);
	
	/* Ahora con doubles. */
	n = 3;
	Matriz D (n, Vector(n, 0));
	Matriz E (n, Vector(n, 0));
	srand(time(0));
		
	forn(i, n)
	{
		forn(j, n)
		{
			D[i][j] = (100) * (rand() / (double)(RAND_MAX+1)) + 100;			
			E[i][j] = (100) * (rand() / (double)(RAND_MAX+1)) + 100;			
		}
	}
	
	cout << "D" << endl;
	mostrarMatrizAlpha(D, n);
	cout << "E" << endl;
	mostrarMatrizAlpha(E, n);
	Matriz resDouble (n, Vector(n));
	mul(D, E, resDouble, n);
	
	cout.precision(12);
	cout << "D*E" << endl;
	mostrarMatrizAlpha(resDouble, n);
	
	return 0;
}
